!
! 	routine de la résolution de Au = g par la méthode de Jacobi
!
SUBROUTINE JACOBI(n,p,eps,h,alpha,beta,c,seuilResidu,nbIterMax,u)!
! 	Arguments
!   	 u : OUT : Vecteur résultat du système linéaire
!   	 n : IN : dimension des blocs dans la matrice A
!		 alpha, epsilon, beta, h, c : IN : parametres qui determinent quelle equation est utilisee
!
implicit none
INTEGER n,p
! Vecteur u(k+1)
DOUBLE PRECISION, DIMENSION(n*n):: u
! Vecteur u(k)
DOUBLE PRECISION, DIMENSION(n*n):: uk
! Matrice A et g, woD
DOUBLE PRECISION A(5), g(n*n), woD(5)
DOUBLE PRECISION eps, alpha, beta, c, h
DOUBLE PRECISION D(1)
DOUBLE PRECISION RES(n*n), vect_residu(n*n)
DOUBLE PRECISION residu
INTEGER compteur
DOUBLE PRECISION :: t_debut, t_fin
! Critere d'arret
DOUBLE PRECISION, INTENT(IN) :: seuilResidu
INTEGER, INTENT(IN) :: nbIterMax
! Initialisation a 0
uk = 0*uk
residu = 1.0D0
! On lance le chronometre
CALL CPU_TIME(t_debut)
!
! Appel des differentes subroutines
CALL createG(n,eps,alpha,beta,c,h,g)
CALL createA(eps,alpha,beta,c,h,A)
!
! Initialisation du compteur
compteur = 1
! On applique la methode de jacobi
! Terme diagonal
D = A(3)
! Matrice sans la diagonale
woD(1) = A(1)
woD(2) = A(2)
woD(3) = 0
woD(4) = A(4)
woD(5) = A(5)
!
! Calcul de chaque itere jusqu'a ce que la convergence soit atteinte
! Ou que le nombre d'iteration soit trop important
u = 1/D * g
! A LAISSER, SINON CA MARCHE PLUS
PRINT *, ''
uk = u
DO WHILE ((residu .GT. seuilResidu) .AND. (compteur .LT. nbIterMax))
	! Calcul du produit matrice vecteur
	CALL produitmatricevecteur(woD,uk,n,p,RES)
	! Calcul de u(k+1) par la méthode de Jacobi
	! On utilise la subroutine combinaison lineaire, car sinon on obtient seulement un scalaire
	CALL COMBINAISONLINEAIRE(n*n,1/D,g - RES,0,uk,u)
	! Calcul du residu
	CALL produitmatricevecteur(A,u,n,p,vect_residu)
	vect_residu = g - vect_residu
	! Calcul de la norme via le produit scalaire
	CALL PRODUITSCALAIRE(vect_residu,vect_residu,n,residu)
	residu = DSQRT(residu)
	! Remise a jour de uk
	uk = u
	! On incremente le nombre d'iterations
	compteur = compteur + 1
ENDDO
CALL CPU_TIME(t_fin)
WRITE(*,*) 'Nombre d iterations pour la methode Jacobi :', compteur
WRITE(*,*) 'Valeur du residu :', residu
WRITE(*,*) 'Temps execution :', t_fin - t_debut, 'secondes'
!
END SUBROUTINE
